//
// Created by wsl on 2024/3/9.
//

#include "LinkQueue.h"

DataStructure_Warning_Unused
static LinkQueue_Node LinkQueue_CreateNode(T e, size_t dataSize) {
	if (NULL == e)
		return NULL;

	//创建节点
	LinkQueue_Node newNode = (LinkQueue_Node) DataStructure_AllocT(LinkQueue_N);
	if (NULL == newNode) {
		//内存分配失败，调用溢出处理函数
		DataStructure_Overflow_Handler();
		return NULL;                //兜底
	}

	//创建数据域
	T data = DataStructure_AllocT(dataSize);
	if (NULL == data) {
		DataStructure_MemoryFree(newNode);
		DataStructure_Overflow_Handler();
		return NULL;
	}
	//为数据域赋值
	DataStructure_MemoryCpy(data, e, dataSize);

	//初始化节点
	newNode->data = data;
	newNode->next = NULL;

	return newNode;
}

DataStructure_Warning_Unused
LinkQueue LinkQueue_create(size_t dataSize) {

	//创建栈
	LinkQueue tempLinkQueue = (LinkQueue) DataStructure_AllocT(LinkQue);
	if (NULL == tempLinkQueue) {
		DataStructure_Overflow_Handler();
		return NULL;
	}

	//初始化各项属性
	tempLinkQueue->head = NULL;    	
	tempLinkQueue->endElem = NULL;
	tempLinkQueue->length = 0;
	tempLinkQueue->dataSize = dataSize;

	//返回对象
	return tempLinkQueue;
}

DataStructure_Warning_Unused
Status LinkQueue_isEmpty(LinkQueue queue) {
	if (NULL == queue)
		return FALSE;

	return queue->length <= 0 ? TRUE : FALSE;
}

DataStructure_Warning_Unused
Status LinkQueue_enQueue(LinkQueue queue, T e) {
	if (NULL == queue || NULL == e)
		return FALSE;

	//创建节点
	LinkQueue_Node node = LinkQueue_CreateNode(e, queue->dataSize);
	if (NULL == node)
		return FALSE;
	
	//尾插入
	if (LinkQueue_isEmpty(queue))                	//空表
		queue->head = node;                 		//标记为首元节点
	else
		queue->endElem->next = node;				//挂载到尾元节点后

		
	queue->endElem = node;            //更新尾元节点
	//数量更新
	queue->length++;

	return TRUE;
}

DataStructure_Warning_Unused
Status LinkQueue_deQueue(LinkQueue queue, T buf) {
	if (NULL == queue || NULL == buf || NULL == queue->head)
		return FALSE;

	//记录释放的节点
	LinkQueue_Node temp = queue->head;

	queue->head = temp->next;

	//释放的节点同时是尾元节点，则目前表中只有一个节点
	(temp == queue->endElem) ? (queue->endElem = NULL) : 0;

	DataStructure_MemoryCpy(buf, temp->data, queue->dataSize);

	//释放首元节点的数据域
	DataStructure_MemoryFree(temp->data);
	//释放旧首元节点
	DataStructure_MemoryFree(temp);

	//更新数量
	queue->length--;

	return TRUE;
}

DataStructure_Warning_Unused
Status LinkQueue_front(LinkQueue queue, T buf) {
	if (NULL == queue || NULL == buf || NULL == queue->head)
		return FALSE;

	DataStructure_MemoryCpy(buf, queue->head, queue->dataSize);

	//更新数量
	queue->length--;

	return TRUE;
}

DataStructure_Warning_Unused
Status LinkQueue_clear(LinkQueue queue) {
	if (NULL == queue)
		return FALSE;

	//记录释放的节点
	LinkQueue_Node curNode = queue->head;
	LinkQueue_Node temp;

	while (curNode)
	{
		temp = curNode;

		curNode = curNode->next;

		//释放首元节点的数据域
		DataStructure_MemoryFree(temp->data);
		//释放旧首元节点
		DataStructure_MemoryFree(temp);

		//更新数量
		queue->length--;
	}

	queue->head = NULL;
	queue->endElem = NULL;

	return TRUE;
}

DataStructure_Warning_Unused
Status LinkQueue_destroy(LinkQueue *queue) {
	if (NULL == queue || NULL == *queue)
		return FALSE;

	//释放所有节点
	if (LinkQueue_isEmpty(*queue) == FALSE)
		LinkQueue_clear(*queue);

	//释放链表对象
	DataStructure_MemoryFree(*queue);

	//置空
	*queue = NULL;

	return TRUE;

}


